package com.kasinf.sample;

import com.xxl.mq.core.XxlMqHelper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Calendar;
import java.util.Date;

/**
 * @author kaiser
 * @date 2025/6/1
 */
@RestController
@RequestMapping("test")
public class TestController {

    @PostMapping("produce")
    public String produce(int type){
        if (type == 1) {

            /**
             * 1、并行消息：
             * 		实现方式：消息中心，Topic属性 “分区策略” 选择为 “轮询” 或 “随机”
             * 		测试Topic：	topic_sample
             */
            XxlMqHelper.produce("topic_sample", "并行消息");

        } else if (type == 2) {

            /**
             * 2、串行消息：
             * 		实现方式：消息中心，Topic属性 “分区策略” 选择为 “第一个” 或 “最后一个”
             * 		测试Topic：topic_sample_02
             */
            XxlMqHelper.produce("topic_sample_02", "串行消息");

        } else if (type == 3) {

            /**
             * 3、分片消息：
             * 		实现方式：
             * 			a、消息中心：Topic 路由策略 = “Hash”；
             * 			b、客户端：生产消息时，自定义消息 “BizId”（作为 “分区hash“ 的 ”业务参数“ ）。相同 BizId 的消息将会被Hash到同一个分区，由同一个消费者串行消费执行；不同 BizId 的消息数据，将会在多个分区并行执行；
             * 		测试Topic：	topic_sample_03
             */
            long bizId = 1000;
            XxlMqHelper.produce("topic_sample_03", "分片消息", -1, bizId);

        } else if (type == 4) {

            /**
             * 4、广播消费：
             * 		实现方式：消息中心，Topic属性 “分区策略” 选择为 “广播”
             * 		测试Topic：	topic_sample_04
             */
            XxlMqHelper.produce("topic_sample_04", "广播消费");


        } else if (type == 5) {

            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MINUTE, 3);
            Date effectTime = calendar.getTime();

            /**
             * 5、延时消息（模拟 延时3min）：
             * 		实现方式：客户端，消息生产时自定义设置 “effectTime”，消息将在指定时间触发消费；
             * 		测试Topic：	topic_sample_05
             */
            XxlMqHelper.produce("topic_sample_05", "延时消息（模拟 延时3min）",  effectTime.getTime());


        } else if (type == 6) {

            /**
             * 6、失败重试消息（模拟 重试3次）：
             * 		实现方式：消息中心，Topic属性 “重试次数” 设置大于零，并设置 “重试策略”、“重试间隔” 即可。
             * 		测试Topic：	topic_sample_06
             */
            XxlMqHelper.produce("topic_sample_06", "失败重试消息（模拟 重试3次））");


        } else if (type == 7) {

            /**
             * 7、性能测试（模拟 生产10000条消息）：
             * 		实现方式：并发提交大批量消息，验证消费速率及成功率；
             * 		测试Topic：	topic_sample_07
             */
            int msgCount = 10000;
            long start = System.currentTimeMillis();
            for (int i = 0; i < msgCount; i++) {
                XxlMqHelper.produce("topic_sample_07", "性能测试（模拟生产10000条消息）");
            }
            long end = System.currentTimeMillis();
            return "Send message count : "+ msgCount +", Cost : " + (end-start) + " ms";

        } else {
            return "Type Error.";
        }

        return "SUCCESS";
    }
}
